# 对应CSDN python系列专栏博客
# 写于2024 04 19
# 主题：掌握Python函数：从Hello World到高级技巧

# 1.1 自定义函数

# def 函数名(参数1,参数2,参数3.......):
#   """ 函数的说明文档 """
#   函数体
#   return 返回值

# 1.2 函数的调用
def hello():
    return """hello world!"""


print(hello())


# 1.3 函数成员
def my_func():
    print("This is my function")


# 添加一个成员到函数对象上
my_func.author = "John Doe"

# 访问函数的成员
print("Author:", my_func.author)  # 输出: Author: John Doe

# 删除成员
del my_func.author


# 2.1 实参和形参
def add(a, b):
    return a + b


print(add(3, 5))


# 2.2 参数传递
def swap(x, y):
    x, y = y, x


# 测试函数
a = 5
b = 10
print("Before swapping:")
print("a =", a)
print("b =", b)

swap(a, b)

print("After swapping:")
print("a =", a)
print("b =", b)


def swap(arr):
    arr[0], arr[1] = arr[1], arr[0]


arr = [5, 10]
print("Before swapping:")
print("arr =", arr)

swap(arr)

print("After swapping:")
print("arr =", arr)


# 2.3 参数类型
# 2.3.1 必需参数


def add(a, b):
    return a + b


print(add(3, ))


# 2.3.2 关键字参数
def greet(name, message):
    return f"{message}, {name}!"


# 使用关键字参数调用函数
print(greet(message="Hi", name="Bob"))


# 2.3.3 缺省参数
def greet(name, message="hello"):
    return f"{message}, {name}!"


# 使用关键字参数调用函数
print(greet("job"))
print(greet(message="Hi", name="Bob"))


# 2.3.4 不定长参数


def sum_values(*args):
    result = 0
    for num in args:
        result += num
    return result


print(sum_values(1, 2, 3))
print(sum_values(1, 2, 3, 4, 5))


def print_values(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")


# 调用函数
print_values(a=1, b=2, c=3)


# 输出:
# a: 1
# b: 2
# c: 3


# 三、 函数的嵌套

def outer_function():  # 外函数
    print("This is outer function.")

    def inner_function():  # 内函数
        print("This is inner function.")

    inner_function()  # 在外函数内部调用内函数


# 调用外函数
outer_function()


def outer_function():
    print("This is outer function.")

    def inner_function():
        print("This is inner function.")

    inner_function()  # 在外函数内部调用内函数


# 调用外函数
outer_function()
inner_function()  # 在外函数外部调用内函数


# 4 函数的说明存档
def greet(name):
    """
    这个函数用于向指定的名字打招呼。

    参数：
    name -- 要打招呼的名字。

    返回值：
    一个包含打招呼消息的字符串。
    """
    return f"Hello, {name}!"


help(greet)
print(greet.__doc__)
